package com.example.chapter07_server.provider;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.util.Log;

import com.example.chapter07_server.database.UserDBHelper;

import android.content.ContentUris; // 补充被注释代码中用到的类


/**
 * 自定义ContentProvider实现类
 * 作用：作为数据访问的中间层，对外提供统一的接口（insert/query/delete等），
 * 隐藏底层SQLite数据库的实现细节，让其他应用可通过ContentResolver安全访问本应用的数据
 */
public class UserInfoProvider extends ContentProvider {

    // 数据库帮助类实例，用于获取SQLiteDatabase对象操作数据库
    private UserDBHelper dbHelper;

    // UriMatcher：用于匹配外部传入的Uri，区分不同的操作类型（如操作所有用户/单个用户）
    // 初始化时传入UriMatcher.NO_MATCH，表示默认匹配失败的返回值
    private static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);

    // 匹配码：表示操作"所有用户"（如查询所有用户、插入新用户）
    private static final int USERS = 1;
    // 匹配码：表示操作"单个用户"（如根据ID删除某个用户）
    private static final int USER = 2;

    // 静态代码块：初始化Uri匹配规则
    static {
        // 规则1：匹配"content://authorities/user"，对应操作所有用户，匹配码为USERS
        // 第一个参数：ContentProvider的权威名（需与UserInfoContent.AUTHORITIES一致）
        // 第二个参数：数据路径（这里"/user"表示用户表的整体数据）
        // 第三个参数：匹配成功后的返回码
        URI_MATCHER.addURI(UserInfoContent.AUTHORITIES, "/user", USERS);

        // 规则2：匹配"content://authorities/user/#"，对应操作单个用户，匹配码为USER
        // "#"是通配符，表示数字（通常对应数据库表的主键ID），如"/user/1"表示ID为1的用户
        URI_MATCHER.addURI(UserInfoContent.AUTHORITIES, "/user/#", USER);
    }

    /**
     * ContentProvider创建时调用（生命周期方法）
     * 作用：初始化数据库帮助类，准备数据访问环境
     * @return true：初始化成功；false：初始化失败（通常返回true）
     */
    @Override
    public boolean onCreate() {
        Log.d("ning", "UserInfoProvider onCreate");
        // 获取数据库帮助类的单例实例（避免重复创建），上下文为当前Provider所在的应用上下文
        dbHelper = UserDBHelper.getInstance(getContext());
        return true; // 表示Provider初始化成功，可对外提供服务
    }

    /**
     * 处理数据插入操作（外部应用通过ContentResolver.insert()调用）
     * @param uri 外部传入的Uri，用于指定插入的目标位置（这里应匹配"content://.../user"）
     * @param values 要插入的数据（键值对，对应UserInfoContent中定义的字段）
     * @return 插入成功后，返回包含新记录ID的Uri；失败返回原Uri或null
     */
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        Log.d("ning", "UserInfoProvider insert");
        // 通过UriMatcher匹配Uri，判断是否为"操作所有用户"（USERS）
        if (URI_MATCHER.match(uri) == USERS) {
            // 获取可写数据库（用于执行插入操作）
            SQLiteDatabase db = dbHelper.getWritableDatabase();
            // 执行插入：参数1=表名，参数2=默认值列（null表示不插入空值），参数3=插入数据
            // 返回值rowId：新插入记录的主键ID（若插入失败返回-1）
            long rowId = db.insert(UserDBHelper.TABLE_NAME, null, values);

            /* 被注释掉的代码作用解析：
             * 1. 判断插入是否成功（rowId > 0表示成功插入一条记录）
             * 2. 若成功，通过ContentUris.withAppendedId()生成包含新记录ID的Uri
             *    例如：原Uri是"content://.../user"，追加ID=5后变为"content://.../user/5"
             * 3. 调用getContentResolver().notifyChange()通知数据变化
             *    作用：当其他应用通过ContentObserver监听该Uri时，会收到数据更新的通知，
             *    便于及时刷新UI（如列表展示最新数据）
             * 目前注释可能是为了简化测试，实际开发中建议保留以保证数据监听机制正常工作
             */
            /*if (rowId > 0) { // 判断插入是否执行成功
                // 如果添加成功，就利用新记录的行号生成新的地址
                Uri newUri = ContentUris.withAppendedId(UserInfoContent.CONTENT_URI, rowId);
                // 通知监听器，数据已经改变
                getContext().getContentResolver().notifyChange(newUri, null);
            }*/
        }
        // 这里返回原Uri（实际应返回带ID的newUri，注释代码未执行导致返回值不标准）
        return uri;
    }

    /**
     * 处理数据查询操作（外部应用通过ContentResolver.query()调用）
     * @param uri 外部传入的Uri，指定查询的目标（这里匹配"content://.../user"表示查询所有用户）
     * @param projection 要查询的列（如{"name", "age"}，null表示查询所有列）
     * @param selection 查询条件（类似SQL的WHERE子句，如"age > ?"）
     * @param selectionArgs 条件参数（替换selection中的"?"，防止SQL注入）
     * @param sortOrder 排序方式（如"name ASC"表示按name升序）
     * @return 查询结果集Cursor；若Uri不匹配或查询失败返回null
     */
    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
                        String[] selectionArgs, String sortOrder) {
        Log.d("ning", "UserInfoProvider query");
        // 匹配Uri为"操作所有用户"（USERS）
        if (URI_MATCHER.match(uri) == USERS) {
            // 获取只读数据库（查询操作建议用只读模式，节省资源）
            SQLiteDatabase db = dbHelper.getReadableDatabase();
            // 执行查询：参数对应表名、查询列、条件、条件参数、分组、筛选、排序
            // 返回Cursor结果集（外部应用需遍历Cursor并关闭，避免内存泄漏）
            return db.query(UserDBHelper.TABLE_NAME, projection, selection, selectionArgs, null, null, null);
        }
        // Uri不匹配时返回null（表示查询失败）
        return null;
    }

    /**
     * 处理数据删除操作（外部应用通过ContentResolver.delete()调用）
     * @param uri 外部传入的Uri，指定删除的目标（所有用户或单个用户）
     * @param selection 删除条件（批量删除时使用）
     * @param selectionArgs 条件参数
     * @return 被删除的记录行数
     */
    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        int count = 0; // 记录被删除的行数
        // 根据Uri匹配结果执行不同的删除逻辑
        switch (URI_MATCHER.match(uri)) {
            // 情况1：Uri匹配"content://.../user"（USERS），表示批量删除用户
            case USERS:
                // 获取可写数据库
                SQLiteDatabase db1 = dbHelper.getWritableDatabase();
                // 执行删除：按selection条件删除表中数据，返回删除行数
                count = db1.delete(UserDBHelper.TABLE_NAME, selection, selectionArgs);
                db1.close(); // 关闭数据库（释放资源）
                break;

            // 情况2：Uri匹配"content://.../user/#"（USER），表示删除单个用户
            case USER:
                // 从Uri中获取最后一段路径（即用户ID，如"/user/2"中的"2"）
                String id = uri.getLastPathSegment();
                // 获取可写数据库
                SQLiteDatabase db2 = dbHelper.getWritableDatabase();
                // 按ID删除：条件为"_id=?"，参数为获取到的id
                count = db2.delete(UserDBHelper.TABLE_NAME, "_id=?", new String[]{id});
                db2.close(); // 关闭数据库
                break;
        }
        // 返回被删除的行数（外部应用可通过该值判断删除是否成功）
        return count;
    }

    /**
     * 返回Uri对应的MIME类型（用于ContentProvider的类型匹配）
     * MIME类型格式：vnd.android.cursor.dir/xxx（表示多条数据）或vnd.android.cursor.item/xxx（表示单条数据）
     * 目前未实现，抛出异常（实际开发中需补充，例如：
     * 当匹配USERS时返回"vnd.android.cursor.dir/vnd.com.dongnaoedu.user"
     * 当匹配USER时返回"vnd.android.cursor.item/vnd.com.dongnaoedu.user"）
     */
    @Override
    public String getType(Uri uri) {
        // TODO: Implement this to handle requests for the MIME type of the data
        // at the given URI.
        throw new UnsupportedOperationException("Not yet implemented");
    }

    /**
     * 处理数据更新操作（外部应用通过ContentResolver.update()调用）
     * 目前未实现，抛出异常（实际开发中需补充，类似delete方法通过Uri匹配区分批量更新/单条更新，
     * 调用SQLiteDatabase的update()方法执行更新，并返回受影响的行数）
     */
    @Override
    public int update(Uri uri, ContentValues values, String selection,
                      String[] selectionArgs) {
        throw new UnsupportedOperationException("Not yet implemented");
    }
}